﻿using CommunityToolkit.Mvvm.ComponentModel;

namespace SourceGit.ViewModels {
    public class PopupHost : ObservableObject {
        public static PopupHost Active {
            get;
            set;
        } = null;

        public Popup Popup {
            get => _popup;
            set => SetProperty(ref _popup, value);
        }

        public static bool CanCreatePopup() {
            return Active != null && (Active._popup == null || !Active._popup.InProgress);
        }

        public static void ShowPopup(Popup popup) {
            popup.HostPageId = Active.GetId();
            Active.Popup = popup;
        }

        public static async void ShowAndStartPopup(Popup popup) {
            popup.HostPageId = Active.GetId();
            Active.Popup = popup;

            if (!popup.Check()) return;

            popup.InProgress = true;
            var task = popup.Sure();
            if (task != null) {
                var finished = await task;
                if (finished) {
                    Active.Popup = null;
                } else {
                    popup.InProgress = false;
                }
            } else {
                Active.Popup = null;
            }
        }

        public virtual string GetId() {
            return string.Empty;
        }

        public async void ProcessPopup() {
            if (_popup != null) {
                if (!_popup.Check()) return;

                _popup.InProgress = true;
                var task = _popup.Sure();
                if (task != null) {
                    var finished = await task;
                    if (finished) {
                        Popup = null;
                    } else {
                        _popup.InProgress = false;
                    }
                } else {
                    Popup = null;
                }
            }
        }

        public void CancelPopup() {
            if (_popup == null) return;
            if (_popup.InProgress) return;
            Popup = null;
        }

        private Popup _popup = null;
    }
}
